package studio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import studio.excepcion.DAOExcepcion;
import studio.modelo.Local;
import studio.modelo.Sala;
import studio.modelo.SalaConfBas;
import studio.util.ConexionBD;

public class SalaDao extends BaseDAO {

	public String insertarSala(Sala objSala) throws DAOExcepcion
	{
		String mensaje="";
		System.out.println("SalaDAO: insertar(Sala objLocal)");
		String query = "insert into sala(Local_idLocal,nombeSala,capacidad,caracteristicas,Usuario_idUsuario,CostoSala) values (?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int idNroArmado=0;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, objSala.getIdLocal());
			stmt.setString(2,objSala.getNombreSala());
			stmt.setInt(3, objSala.getCapacidad());
			stmt.setString(4,objSala.getCaracteristicas());
			stmt.setInt(5,objSala.objAdmin.getIdUsuario());
			stmt.setDouble(6,objSala.getCostoxHora());
			int i = stmt.executeUpdate();
			if (i != 1) 
			{
				mensaje="No se pudo insertar";
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				String ConsultarIdGenerado="SELECT LAST_INSERT_ID()";
				stmt=con.prepareStatement(ConsultarIdGenerado);
				rs=stmt.executeQuery();
				if(rs.next())
				{
					idNroArmado=rs.getInt(1);
				}
				mensaje="10.-Sala Grabada Correctamente";
				//javax.swingJOptionPane.showMessageDialog(null, "Sala Grabada Correctamente","Studio 7i",1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} 
		finally
		{
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return mensaje;
	}
	
	//UPDATE `studio7i`.`sala` SET `nombeSala`='Sala de Lima', `capacidad`=20, `caracteristicas`='Tiene todo equipado' WHERE `idSala`='2';
	public String actualizarSala(Sala objSala) throws DAOExcepcion
	{
		String msg="";
		System.out.println("SalaDAO: actualizarSala(Sala objLocal)");
		String query = "UPDATE sala SET Local_idLocal=?,nombeSala=?, capacidad=?, caracteristicas=?,Usuario_idUsuario=?,CostoSala=? WHERE idSala=?";
		Connection con = null;
		PreparedStatement stmt = null;
		int nro=0;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,objSala.getIdLocal());
			stmt.setString(2,objSala.getNombreSala());
			stmt.setInt(3, objSala.getCapacidad());
			stmt.setString(4,objSala.getCaracteristicas());
			stmt.setInt(5,objSala.objAdmin.getIdUsuario());
			stmt.setDouble(6, objSala.getCostoxHora());
			stmt.setInt(7,objSala.getIdSala());
			 nro = stmt.executeUpdate();
			if (nro != 1) 
			{
				msg="No se pudo insertar";
				throw new SQLException("No se pudo insertar");
			}
			else
			{
				msg="10.-Sala Actualizada Correctamente";
			//	javax.swing.JOptionPane.showMessageDialog(null, "Sala Actualizada Correctamente","Studio 7i",1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} 
		finally
		{
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return msg ;
	}
	
	
	public boolean ValidarNombreDuplicado(Sala objSala) throws DAOExcepcion 
	{
		boolean valor=true;
		System.out.println("SalaDao: ValidarNombreDuplicado()");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select count(*) as Nro from sala where nombesala=? and Local_idLocal=?";
			stmt = con.prepareStatement(query);
			//System.out.println(objSala.getNombreSala());
			stmt.setString(1,objSala.getNombreSala());
			stmt.setInt(2,objSala.getIdLocal());
			rs = stmt.executeQuery();
			rs.first();
			int Nro=rs.getInt("Nro");
			System.out.println(Nro);
			if (Nro>0)
			{
				valor=false;
			}
			else
			{
				valor=true;
			}
			
		} catch (SQLException e) 
		{
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		}
		finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return valor;
	}
	
	public Collection<Sala> ListarSala(String nombre) throws DAOExcepcion {
		System.out.println("Sala: ListarSala(String nombre)");
		String query = "SELECT s.idSala, s.nombeSala,s.Local_idLocal,l.nombreLocal,s.Capacidad,s.Caracteristicas,s.Usuario_idUsuario,s.CostoSala FROM Sala s "+
" inner join local l on s.Local_idLocal=l.idLocal WHERE s.nombeSala  like ?";
		Collection<Sala> listaSala = new ArrayList<Sala>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Sala vo = new Sala();
				
				vo.setIdSala(rs.getInt("idSala"));
				vo.setNombreSala(rs.getString("nombeSala"));
				Local objLocal =new Local();
				objLocal.setIdLocal(rs.getInt("Local_idLocal"));
				objLocal.setNombreLocal(rs.getString("nombreLocal"));
				vo.setObjLocal(objLocal);
			    vo.setIdLocal(rs.getInt("Local_idLocal"));
				vo.setCapacidad(rs.getInt("Capacidad"));
				vo.setCaracteristicas(rs.getString("caracteristicas"));
				vo.setUsuario_idUsuario(rs.getInt("Usuario_idUsuario"));
				vo.setCostoxHora(rs.getDouble("CostoSala"));
				listaSala.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listaSala;
	}
	
	public Collection<Sala> ListarSalaXLocal(String nombre,String local,String capacidad) throws DAOExcepcion {
		System.out.println("Sala: ListarSalaXLocal(String nombre, String local, String capacidad)");
		String query ="SELECT s.idSala, s.nombeSala,s.Local_idLocal,l.nombreLocal,s.Capacidad,s.Caracteristicas,s.Usuario_idUsuario,s.CostoSala FROM Sala s "+
		" inner join local l on s.Local_idLocal=l.idLocal WHERE s.nombeSala  like ? || l.nombreLocal like? || s.Capacidad like ?";
			
		Collection<Sala> listaSala = new ArrayList<Sala>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			stmt.setString(2,"%" + local + "%");
			stmt.setString(3,"%" + capacidad + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Sala vo = new Sala();
				vo.setIdSala(rs.getInt("idSala"));
				vo.setNombreSala(rs.getString("nombeSala"));
			    vo.setIdLocal(rs.getInt("s.Local_idLocal"));
			    vo.setNombreLocal(rs.getString("nombreLocal"));
				vo.setCapacidad(rs.getInt("Capacidad"));
				vo.setCaracteristicas(rs.getString("caracteristicas"));
				vo.setUsuario_idUsuario(rs.getInt("Usuario_idUsuario"));
				vo.setCostoxHora(rs.getDouble("CostoSala"));
				listaSala.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listaSala;
	}

//	
//	select t1.idConfig_Basica,t2.idtipo,t2.descripcion,t1.qtdBas 
//	from SalaConfig_Basica t1 
//	    inner join TipoInstrumento t2 
//	    on t1.TipoInstrumento_idTipo=t2.idtipo
	public Collection<SalaConfBas> ListarConfBasica() throws DAOExcepcion {
		System.out.println("Sala: ListarConfBasica(String nombre)");
		String query = "select t1.idConfig_Basica,t2.idtipo,t2.descripcion,t1.qtdBas from SalaConfig_Basica t1 inner join TipoInstrumento t2 " +
				"on t1.TipoInstrumento_idTipo=t2.idtipo" ;
		Collection<SalaConfBas> listaconfig = new ArrayList<SalaConfBas>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				SalaConfBas obj = new SalaConfBas();
				obj.setIdConfig_Basica(rs.getInt("idConfig_Basica"));
				obj.setIdtipo(rs.getInt("idtipo"));
			    obj.setDescripcion(rs.getString("descripcion"));
				obj.setQtdBas(rs.getInt("qtdBas"));
				listaconfig.add(obj);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return listaconfig;
	}
	
	public Sala RetornarSala(int idSala) throws DAOExcepcion {
		System.out.println("SalaDAO: RetornarSala(int DescSala)");
		Sala objSala = new Sala();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT idSala, nombeSala,Local_idLocal,Capacidad,Caracteristicas,Usuario_idUsuario,CostoSala FROM Sala where idSala=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,  idSala);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objSala.setIdSala(rs.getInt("idSala"));
				objSala.setNombreSala(rs.getString("nombeSala"));
				objSala.setIdLocal(rs.getInt("Local_idLocal"));
				objSala.setCapacidad(rs.getInt("Capacidad"));
				objSala.setCaracteristicas(rs.getString("caracteristicas"));
				objSala.setUsuario_idUsuario(rs.getInt("Usuario_idUsuario"));
				objSala.setCostoxHora(rs.getDouble("CostoSala"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objSala;
	}
}
